perm filename SIM.SAI[CMU,AIL] blob
sn#126739 filedate 1974-10-25 generic text, type T, neo UTF8
00100 BEGIN "SIM"
00200
00300 DEFINE ! ="COMMENT";
00400 INTEGER CNTR;
00500 INTEGER COUNT,BR,EOF,COUNT1,BR1,EOF1,FLAG;
00600 INTEGER PPRT,LPRT,REM,MR,TQ,NA,M,C,T;
00700 INTEGER PROC,D;
00800 INTEGER DACUM;
00900 STRING S1;
01000 REAL TM,TACUM,QBAR;
01100 INTEGER I,I1,I2;
01200 REAL R1,R2;
01300 DEFINE CHECK="TRUE";
01400 INTEGER STRATEGY;
01500
01600 REAL PROCEDURE EXPONENTIAL(REAL F);
01700 BEGIN
01800 RETURN(-1.0/F*LOG(RAN(0)))
01900 END;
02000
02100 OPEN(1,"DSK",0,2,0,COUNT,BR,EOF);
02200 OPEN(2,"DSK",0,0,2,COUNT1,BR1,EOF1);
02300 OUTSTR("ID=");
02400 S1←INCHWL;
02500 OUTSTR("STRATEGY=");
02600 STRATEGY←CVD(INCHWL);
02700 LOOKUP(1,"SIMIN."&S1,FLAG);
02800 ENTER(2,"SIMOUT."&S1,FLAG);
02900 T←INTIN(1);
03000 C←INTIN(1);
03100
03200 BEGIN "D1"
03300 REAL ARRAY F,FC,UC[1:C];
03400 FOR I←1 STEP 1 UNTIL C DO
03500 F[I]←REALIN(1);
03600 QBAR←0;
03700 FOR I←1 STEP 1 UNTIL C DO
03800 QBAR←QBAR+I*F[I];
03900
04000 FOR M←1 DO
04100 BEGIN "D2"
04200 INTEGER ARRAY ALLOC,DMD,PRT[1:M];
04300 REAL ARRAY P[M:M*C];
04400 REAL ARRAY A[1:M];
04500
04600 PROCEDURE INITIAL;
04700
04800 BEGIN
04900 PPRT←LPRT←REM←MR ←TQ←NA←TACUM←0;
05000 ARRCLR(ALLOC);
05100 ARRCLR(DMD);
05200 ARRCLR(PRT);
05300 ARRCLR(FC);
05400 ARRCLR(UC);
05500 ARRCLR(P);
05600 ARRCLR(A);
05700 I1←(T-C)/M MIN C;
05800 FOR I2←1 STEP 1 UNTIL M DO
05900 ALLOC[I2]←I1;
06000 NA←M;
06100 TQ←M*I1;
06200 MR←C-I1;
06300 REM←T-TQ;
06400 END;
06500
06600 PROCEDURE NEWTRAN;
06700
06800 BEGIN
06900 INTEGER P;
07000 TM←-1.0;
07100 FOR I←1 STEP 1 UNTIL M DO
07200 IF DMD[I]=0 THEN
07300 BEGIN
07400 R1←EXPONENTIAL(IF (P←ALLOC[I])=1 OR P=C THEN
07500 F[P] ELSE F[P]*2);
07600 IF TM=-1.0 THEN
07700 BEGIN
07800 PROC←I;
07900 TM←R1;
08000 END ELSE
08100 IF TM>R1 THEN
08200 BEGIN
08300 PROC←I;
08400 TM←R1;
08500 END
08600 END;
08700 IF RAN(0)>0.5 THEN D←1 ELSE D←-1;
08800 DACUM←DACUM+D;
08900 IF ALLOC[PROC]=1 THEN D←1 ELSE
09000 IF ALLOC[PROC]=C THEN D←-1;
09100 END;
09200
09300 PROCEDURE UPDATE;
09400
09500 BEGIN
09600 FOR I←1 STEP 1 UNTIL M DO
09700 IF DMD[I]=0 THEN
09800 FC[ALLOC[I]]←FC[ALLOC[I]]+TM ELSE
09900 UC[ALLOC[I]+1]←UC[ALLOC[I]+1]+TM;
10000 P[TQ]←P[TQ]+TM;
10100 A[NA]←A[NA]+TM;
10200 TACUM←TACUM+TM;
10300 END;
10400
10500 PROCEDURE NEWSYS;
10600 BEGIN
10700 CASE STRATEGY OF
10800 BEGIN
10900
11000 ! 0: FIFO;
11100 BEGIN
11200 IF D=1 THEN
11300 BEGIN
11400 IF MR<REM OR C-ALLOC[PROC]=REM THEN
11500 ALLOC[PROC]←ALLOC[PROC]+1 ELSE
11600 BEGIN
11700 DMD[PROC]←1;
11800 IF PPRT=0 THEN LPRT←PPRT←PROC ELSE
11900 BEGIN
12000 PRT[LPRT]←PROC;
12100 LPRT←PROC;
12200 END;
12300 PRT[PROC]←0;
12400 END
12500 END ELSE
12600 BEGIN
12700 INTEGER P,PO;
12800 ALLOC[PROC]←ALLOC[PROC]-1;
12900 IF PPRT≠0 THEN
13000 BEGIN
13100 MR←0;
13200 FOR I←1 STEP 1 UNTIL M DO
13300 IF ALLOC[I]>MR THEN MR←ALLOC[I];
13400 MR←C-MR;
13500 IF MR≤REM THEN
13600 BEGIN
13700 ALLOC[PPRT]←ALLOC[PPRT]+1;
13800 DMD[PPRT]←0;
13900 PPRT←PRT[PPRT];
14000 END ELSE
14100 BEGIN
14200 P←PPRT;
14300 WHILE P≠0 DO
14400 IF C-ALLOC[P]=MR THEN
14500 BEGIN
14600 ALLOC[P]←ALLOC[P]+1;
14700 DMD[P]←0;
14800 IF P=PPRT THEN PPRT←PRT[PPRT] ELSE
14900 PRT[PO]←PRT[P];
15000 DONE
15100 END ELSE
15200 BEGIN
15300 PO←P;
15400 P←PRT[P]
15500 END
15600 END
15700 END
15800 END
15900 END;
16000
16100 ! 1: SMALLEST A FIRST;
16200
16300 BEGIN
16400 IF D=1 THEN
16500 BEGIN
16600 IF MR<REM OR C-ALLOC[PROC]=REM THEN
16700 ALLOC[PROC]←ALLOC[PROC]+1 ELSE DMD[PROC]←1;
16800 END ELSE
16900 BEGIN
17000 ALLOC[PROC]←ALLOC[PROC]-1;
17100 MR←0;
17200 FOR I←1 STEP 1 UNTIL M DO
17300 IF MR<ALLOC[I] THEN MR←ALLOC[I];
17400 MR←C-MR;
17500 IF MR≤REM THEN
17600 BEGIN
17700 I1←C;I2←0;
17800 FOR I←1 STEP 1 UNTIL M DO
17900 IF DMD[I]=1 AND ALLOC[I]<I1 THEN
18000 BEGIN
18100 I1←ALLOC[I];
18200 I2←I;
18300 END;
18400 IF I2≠0 THEN
18500 BEGIN
18600 ALLOC[I2]←ALLOC[I2]+1;
18700 DMD[I2]←0;
18800 END;
18900 END ELSE
19000 BEGIN
19100 I1←C;
19200 I2←0;
19300 FOR I←1 STEP 1 UNTIL M DO
19400 IF C-ALLOC[I]=MR AND DMD[I]=1 AND ALLOC[I]<I1 THEN
19500 BEGIN
19600 I1←ALLOC[I];
19700 I2←I;
19800 END;
19900 IF I2≠0 THEN
20000 BEGIN
20100 ALLOC[I2]←ALLOC[I2]+1;
20200 DMD[I2]←0;
20300 END;
20400 END
20500 END
20600 END
20700 END;
20800 REM←T;
20900 MR←C;
21000 TQ←0;
21100 NA←0;
21200 FOR I←1 STEP 1 UNTIL M DO
21300 BEGIN
21400 REM←REM-ALLOC[I];
21500 IF C-ALLOC[I]<MR THEN
21600 MR←C-ALLOC[I];
21700 TQ←TQ+ALLOC[I]+DMD[I];
21800 NA←NA+1-DMD[I];
21900 END;
22000 END;
22100
22200 PROCEDURE DATOUT;
22300
22400 BEGIN
22500 R1←R2←0;
22600 FOR I←1 STEP 1 UNTIL C DO
22700 BEGIN
22800 R1←R1+FC[I];
22900 R2←R2+UC[I];
23000 END;
23100 FOR I←1 STEP 1 UNTIL C DO
23200 BEGIN
23300 FC[I]←FC[I]/R1;
23400 UC[I]←UC[I]/R2;
23500 END;
23600 FOR I←M STEP 1 UNTIL M*C DO
23700 P[I]←P[I]/TACUM;
23800 FOR I←1 STEP 1 UNTIL M DO
23900 A[I]←A[I]/TACUM;
24000 SETFORMAT(4,0);
24100 OUT(2,"M="&CVS(M)&" ");
24200 R1←0;
24300 FOR I←1 STEP 1 UNTIL M DO
24400 R1←R1+I*A[I];
24500 SETFORMAT(14,7);
24600 OUT(2,"ABAR="&CVF(R1)&'15&'12&'12);
24700 IF NOT CHECK THEN RETURN;
24800 OUT(2,"DACUM="&CVS(DACUM)&'15&'12&'12);
24900 OUT(2," F[1:C] FC[1:C]= UC[1:C]= P[M:MC]= A[1:M]="&'15&'12&'12);
25000 I1←M*C-M+1;
25100 FOR I←1 STEP 1 UNTIL C DO
25200 BEGIN
25300 IF I≤C THEN OUT(2,CVF(F[I])&CVF(FC[I])&CVF(UC[I])) ELSE
25400 OUT(2," ");
25500 OUT(2,CVF(P[I+M-1]));
25600 IF I≤M THEN OUT(2,CVF(A[I]));
25700 OUT(2,'15&'12);
25800 END;
25900 OUT(2,'15&'12&'12&'12);
26000 END;
26100
26200 RAN(300301);
26300 INITIAL;
26400 FOR CNTR←1 STEP 1 UNTIL 50 DO
26500 BEGIN
26600 NEWTRAN;
26700 UPDATE;
26800 NEWSYS;
26900 END;
27000 DATOUT;
27100 END "D2";
27200 END "D1";
27300 CLOSE(1);
27400 CLOSE(2);
27500 END "SIM"